package com.recycle.controller.login;


import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.recycle.common.base.BaseInfoProperties;
import com.recycle.common.exceptions.MyCustomException;
import com.recycle.common.result.GraceJSONResult;
import com.recycle.common.result.ResponseStatusEnum;
import com.recycle.common.utils.JWTUtils;
import com.recycle.common.utils.MD5Utils;
import com.recycle.pojo.SysUser;
import com.recycle.pojo.bo.RegistLoginBO;
import com.recycle.tasks.SMSTask;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import java.util.UUID;

@RestController
@Slf4j
public class PassportController extends BaseInfoProperties {
    @Resource
    private SMSTask smsTask;

    @Resource
    private JWTUtils jwtUtils;


    @PostMapping("login")
    public GraceJSONResult login(@RequestBody RegistLoginBO registLoginBO,
                                  HttpServletRequest request) throws Exception {
        if(StringUtils.isBlank(registLoginBO.getUsername())){
            throw new MyCustomException("用户名不能为空");
        }
        if(StringUtils.isBlank(registLoginBO.getPassword())){
            throw new MyCustomException("密码不能为空");
        }
        if(StringUtils.isBlank(registLoginBO.getCode())){
            throw new MyCustomException("验证码不能为空");
        }

        SysUser user = new SysUser().selectOne(new QueryWrapper<SysUser>().eq("username", registLoginBO.getUsername()));
        if(user == null){
            throw new MyCustomException(ResponseStatusEnum.USER_ISNOT_EXIST_ERROR);
        }
        if(!MD5Utils.verify(registLoginBO.getPassword(), user.getPassword(), SLAT)){
            throw new MyCustomException(ResponseStatusEnum.PASSWORD_ERROR);
        }

//        JWTUtils.







//        String mobile = registLoginBO.getMobile();
//        String code = registLoginBO.getSmsCode();
//
//        // 1. 从redis中获得验证码进行校验判断是否匹配
//        String redisCode = redis.get(MOBILE_SMSCODE + ":" + mobile);
//        if (StringUtils.isBlank(redisCode) || !redisCode.equalsIgnoreCase(code)) {
//            return GraceJSONResult.errorCustom(ResponseStatusEnum.SMS_CODE_ERROR);
//        }
//
//        // 2. 根据mobile查询数据库，如果用户存在，则提示不能重复注册
//        Users user = usersService.queryMobileIfExist(mobile);
//        if (user == null) {
//            // 2.1 如果查询数据库中用户为空，则表示用户没有注册过，则返回错误信息
//            return GraceJSONResult.errorCustom(ResponseStatusEnum.USER_NOT_EXIST_ERROR);
//        }
//
//        // 4. 设置用户分布式会话，保存用户的token令牌，存储到redis中
//        String uToken = TOKEN_USER_PREFIX + SYMBOL_DOT + UUID.randomUUID();
//        // 本方式只能限制用户在一台设备进行登录
//        // redis.set(REDIS_USER_TOKEN + ":" + user.getId(), uToken);   // 设置分布式会话
//        // 本方式允许用户在多端多设备进行登录
//        redis.set(REDIS_USER_TOKEN + ":" + uToken, user.getId());   // 设置分布式会话
//
//        // 5. 返回用户数据给前端
//        UsersVO usersVO = new UsersVO();
//        BeanUtils.copyProperties(user, usersVO);
//        usersVO.setUserToken(uToken);

        return GraceJSONResult.ok();
    }


    @PostMapping("logout")
    public GraceJSONResult logout(@RequestParam String userId,
                                  HttpServletRequest request) throws Exception {
        // 清理用户的分布式会话
        redis.del(REDIS_USER_TOKEN + ":" + userId);
        return GraceJSONResult.ok();
    }
}